package com.syz.httpd.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;

/**
 * 属性文件操作工具类
 * <p>
 * 提供基本的属性文件的加载和读取操作，不包括写入功能
 * <p>
 * 更多复杂的属性文件操作参考<code> SimpleConfig</code>
 * 
 * @author SYZ
 * @date 2017年3月7日 上午9:54:57
 * @version 1.0.0
 * @see com.hyxell.common.core.util.PropsUtil
 */
public class PropsUtil {
	private static final Log logger = StaticLog.get();

	private PropsUtil() {
		// 静态不能实例化
	}

	/**
	 * 加载属性文件
	 * @param propsPath String
	 * @return  Properties
	 */
	public static Properties loadProps(String propsPath) {
		Properties props = new Properties();
		InputStream is = null;
		try {
			if (propsPath==null) {
				throw new IllegalArgumentException();
			}
			String suffix = ".properties";
			if (propsPath.lastIndexOf(suffix) == -1) {
				propsPath += suffix;
			}
			is = PropsUtil.class.getClassLoader().getResourceAsStream(propsPath);
			if (is != null) {
				props.load(is);
			}
		} catch (Exception e) {
			logger.error("加载属性文件出错！", e);
			throw new RuntimeException(e);
		} finally {
			try {
				if (is != null) {
					is.close();
				}
			} catch (IOException e) {
				logger.error("释放资源出错！", e);
			}
		}
		return props;
	}

	/**
	 *  加载属性文件，并转为 Map
	 * @param propsPath 属性文件的咯经，classpath中获取
	 * @return Map<String, String>
	 */
	public static Map<String, String> loadPropsToMap(String propsPath) {
		Map<String, String> map = new HashMap<String, String>();
		Properties props = loadProps(propsPath);
		for (String key : props.stringPropertyNames()) {
			map.put(key, props.getProperty(key));
		}
		return map;
	}

	/**
	 * 是否包括key
	 * @param props Properties
	 * @param key  String
	 * @return boolean
	 */
	public static boolean containsKey(Properties props, String key) {
		return props.containsKey(key);
	}

	/**
	 * 是否包括值
	 * @param props Properties
	 * @param val String
	 * @return  boolean
	 */
	public static boolean containsVal(Properties props, String val) {
		return props.containsValue(val);
	}

	/**
	 * 获取字符型属性 推荐方法：获取字符串值的支持
	 * @param props Properties
	 * @param key String
	 * @return String
	 */
	public static String getString(Properties props, String key) {
		String value = "";
		if (props.containsKey(key)) {
			value = props.getProperty(key);
		}
		return value;
	}

	/**
	 * 获取字符型属性（带有默认值）
	 * @param props  Properties
	 * @param key String
	 * @param defalutValue 默认值
	 * @return value
	 */
	public static String getString(Properties props, String key,
			String defalutValue) {
		String value = defalutValue;
		if (props.containsKey(key)) {
			value = props.getProperty(key);
		}
		return value;
	}

	/**
	 * 获取数值型属性
	 * @param props Properties
	 * @param key 关键字
	 * @return value 数值形式
	 */
	public static int getNumber(Properties props, String key) {
		int value = 0;
		if (props.containsKey(key)) {
			value = Integer.parseInt(props.getProperty(key));
		}
		return value;
	}

	/**
	 *  获取数值型属性（带有默认值）: (PropsUtil.getNumber)
	 * @param props  Properties
	 * @param key 关键字
	 * @param defaultValue 默认值
	 * @return Number
	 */
	public static int getNumber(Properties props, String key, int defaultValue) {
		int value = defaultValue;
		if (props.containsKey(key)) {
			value = Integer.parseInt(props.getProperty(key));
		}
		return value;
	}

	/**
	 * 获取布尔型属性
	 * @param props Properties
	 * @param key 关键字
	 * @return boolean 
	 */
	public static boolean getBoolean(Properties props, String key) {
		return getBoolean(props, key, false);
	}

	/**
	 * 获取布尔型属性（带有默认值）
	 * @param props Properties
	 * @param key 关键字
	 * @param defalutValue 默认值
	 * @return boolean
	 */
	public static boolean getBoolean(Properties props, String key,
			boolean defalutValue) {
		boolean value = defalutValue;
		if (props.containsKey(key)) {
			value = Boolean.parseBoolean(props.getProperty(key));
		}
		return value;
	}

	/**
	 * 获取指定前缀的相关属性
	 * @param props Properties
	 * @param prefix 前缀
	 * @return Map<String, Object>
	 */
	public static Map<String, Object> getMap(Properties props, String prefix) {
		Map<String, Object> kvMap = new LinkedHashMap<String, Object>();
		Set<String> keySet = props.stringPropertyNames();
		if (keySet.size()>0) {
			for (String key : keySet) {
				if (key.startsWith(prefix)) {
					String value = props.getProperty(key);
					kvMap.put(key, value);
				}
			}
		}
		return kvMap;
	}
}
